-- 获取参数
local leaderboard = KEYS[1]
local player = ARGV[1]
local increment_score = tonumber(ARGV[2])
local timestamp = tonumber(ARGV[3])
local is_early_higher = ARGV[4] == "true"

-- 获取当前玩家的分数
local current_score = redis.call('ZSCORE', leaderboard, player)

local new_score

if current_score then
    -- 玩家已经存在排行榜中，累加新的分数到当前分数的整数部分
    local integer_score = math.floor(tonumber(current_score))
    new_score = integer_score + increment_score
else
    -- 玩家不在排行榜中，直接使用增量分数
    new_score = increment_score
end

-- 使用更大的除数来缩小时间戳的影响，确保时间戳只影响小数部分
local timestamp_adjustment
if is_early_higher then
    -- 早到的分数更高，时间越早，调整值越大
    timestamp_adjustment = (9999999999999 - timestamp) / 10000000000000
else
    -- 晚到的分数更高，时间越晚，调整值越大
    timestamp_adjustment = timestamp / 10000000000000
end

local final_score = new_score + timestamp_adjustment

-- 使用 ZADD 更新排行榜
redis.call('ZADD', leaderboard, final_score, player)

-- 返回累加后的整数部分分数
return new_score
